package code.notdo;

/**
 * author： yeswater
 * create： 2023/12/22
 *
 * 买卖股票的最佳时机含冷冻期 mid
 *
 * 冷冻期怎么搞？？？
 *
 */
public class T309 {
    public int maxProfit(int[] prices) {
        int days = prices.length;
        // 定义动态规划状态变量，第一维记录天数，第二维记录股票的状态
        int[][] dp= new int[days][4];
    
        // 初始化状态变量
        // 状态0，表示不持有股票，且没卖出，意思就是本来就不持有，没做任何买卖
        dp[0][0] = 0;
        // 状态1，表示不持有股票，原因是今天卖出了（这里因为是第0天，所以没买入，所以收益也是0）
        dp[0][1] = 0;
        // 状态2，表示持有股票，今天买入的，因为是买入，所以收入是负的，
        dp[0][2] = -1 * prices[0];
        // 状态3，表示持有股票，非今天买入，从前一天继承过来的（这里因为是第0天，所以相当于是今天买入，今天卖出）
        dp[0][3] = -1 * prices[0];
    
        for (int i = 1; i < days; i++) {
            // 第i天不持有且本来也不持有，那说明前一天也不持有，即使持有也卖出了，那就是0和1两种情况
            dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1]);
            // 第i天不持有，因为今天卖出了，那收益就是今天的股票价格加上 之前累加的
            dp[i][1] = Math.max(dp[i-1][2], dp[i-1][3]) + prices[i];
            // 第i天持有，而且是今天买入（排除状态2、3），那么根据冷冻期 昨天一定没有卖出今天才能买入
            dp[i][2] = dp[i-1][0] - prices[i];
            // 第i天持有，且非今天买入, 那就是之前买入，计算之前累加的
            dp[i][3] = Math.max(dp[i-1][2], dp[i-1][3]);
        }
    
        //因为买卖到最后，一定是不持有的（即使亏了，卖也比不卖强），所以应该是0和1两种状态，取较大值
        return Math.max(dp[days-1][0], dp[days-1][1]);
    }
}
